package com.unitd.base.frame.spring.editor;

import org.springframework.util.StringUtils;

import java.beans.PropertyEditorSupport;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 自定义的SpringMVC的属性日期绑定对象
 *
 * @author Hudan
 * @version 1.0
 * @filename CustomDateEditor.java
 * @copyright www.unitd.com
 * @date 2019-01-25
 */
public class CustomDateEditor extends PropertyEditorSupport {

    /** 是否允许为空 */
    private final boolean allowEmpty;
    /** 日期格式化对象 */
    private DateFormat dateFormat;


    /**
     * 构造方法
     *
     * @param allowEmpty 是否允许为空
     */
    public CustomDateEditor(boolean allowEmpty) {
        this.allowEmpty = allowEmpty;
    }

    /**
     * 设置SpringMVC的属性日期绑定对象的显示格式
     *
     * @param text 时间值
     * @throws IllegalArgumentException
     */
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (this.allowEmpty && !StringUtils.hasText(text)) {
            setValue(null);
            return;
        }
        try {
            if (text.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
                this.dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            } else if (text.matches("\\d{4}年\\d{2}月\\d{2}日")) {
                this.dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
            } else if (text.matches("\\d{4}\\.\\d{2}\\.\\d{2}")) {
                this.dateFormat = new SimpleDateFormat("yyyy.MM.dd");
            } else {
                this.dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            }
            this.dateFormat.setLenient(false);
            setValue(this.dateFormat.parse(text));
        } catch (ParseException ex) {
            throw new IllegalArgumentException("Could not parse date: " + ex.getMessage(), ex);
        }
    }

    /**
     * 获取格式化后的时间对象值
     *
     * @return 时间对象值
     */
    @Override
    public String getAsText() {
        Date value = (Date) getValue();
        if (this.dateFormat != null) {
            this.dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        }
        return (value != null ? this.dateFormat.format(value) : "");
    }
}